#include "stm32f10x.h"
#include"flash.h"
#include"stm32f10x_flash.h"
#include"GPRS.h"
#include"uart.h"
#include"SD.h"
#include"uCOS_Include.h"

uint32_t Address_Corner=0x0800EC00;	 //弯道坐标起始地址59K~60K
uint32_t Address_Stand =0x0800F400;	 //站点坐标起始地址61K~63K

uint32_t Address_Speed=0x0800DC00;	 //超速值55k
uint32_t Address_ID=0x0800E000;	 //超速值、ID号、IP和端口号起始地址56K
uint32_t Address_Corner_Course=0x0800E400;	 //弯道航向角坐标起始地址57K
uint32_t Address_Stand_Course =0x0800E800;	 //站点航向角坐标起始地址58K

 
extern uint16_t shili_to_shuirao;
extern uint16_t laomo_to_huangshi;
extern uint16_t sancha_to_tongqiang;
extern uint16_t Other_Speeding_Value;
extern uint16_t Corner_Speeding_Value;
extern uint16_t Update_Rate;

int32_t Modify_Weidu_In,Modify_Jingdu_In;
int16_t Modify_Course_In;
int32_t Modify_Weidu_Out,Modify_Jingdu_Out;
int16_t Modify_Course_Out;
extern u8 PC_Command;
u8 Num,Direction;

//u8 IP_Buffer[8]={0x03,0x0d,0x09,0x00,0x0d,0x08,0x0d,0x0b};	 //	61.144.216.219
u8 IP_Buffer[8]={0x0d,0x0c,0x0a,0x08,0x0c,0x0c,0x05,0x0b};  //220.168.204.91
//u8 PORT_Buffer[4]={0x00,0x09,0x01,0x0c};	 //2332
//u8 PORT_Buffer[4]={0x00,0x0d,0x00,0x04};	 //3332
u8 PORT_Buffer[4]={0x00,0x09,0x02,0x08};   //2344
u8 Function_Word[3]={"00"};
u8 Error=0;
  /************************************
函数功能：弯道、站点、ID、IP端口号
		  和超速值数据写入Flash中
函数入口：无
函数出口：无
函数说明：		 
***********************************/
void Flash_Init_Write(void)
{
	u8 i,j;
	uint16_t temp;
	FLASH_Status Statu;
	u32 *P_Speed=(uint32_t*)0x0800DC00;
	u32  t;

	t=*P_Speed;
	if(t==0xffffffff)
	{
		FLASH_Unlock(); 
		FLASH_ErasePage(0x0800DC00); //擦除页面	 超速值
		FLASH_ErasePage(0x0800E000); //擦除页面	 ID号、IP和端口号修改
		FLASH_ErasePage(0x0800E400); //擦除页面	 弯道航向角修改
		FLASH_ErasePage(0x0800E800); //擦除页面	 站点航向角坐标修改
	
	
		Statu=FLASH_ProgramHalfWord(Address_Speed,shili_to_shuirao);
		Statu=FLASH_ProgramHalfWord(Address_Speed+2,laomo_to_huangshi);
		Statu=FLASH_ProgramHalfWord(Address_Speed+4,sancha_to_tongqiang);
		Statu=FLASH_ProgramHalfWord(Address_Speed+6,Other_Speeding_Value);
		Statu=FLASH_ProgramHalfWord(Address_Speed+8,Corner_Speeding_Value);
		Statu=FLASH_ProgramHalfWord(Address_Speed+10,Update_Rate);

		for(i=0;i<4;i++)
		{
			temp=IP_Buffer[2*i+1];
			temp=temp<<8;
			temp=temp+IP_Buffer[2*i];
			Statu=FLASH_ProgramHalfWord(Address_ID+i*2,temp);
		}
		for(i=0;i<2;i++)
		{
			temp=PORT_Buffer[2*i+1];
			temp=temp<<8;
			temp=temp+PORT_Buffer[2*i];
			Statu=FLASH_ProgramHalfWord(Address_ID+8+i*2,temp);
		}
		for(i=0;i<2;i++)
		{
			temp=id[2*i+1];
			temp=temp<<8;
			temp=temp+id[2*i];
			Statu=FLASH_ProgramHalfWord(Address_ID+12+i*2,temp);
		}
		
		for(i=0;i<64;i++)
		{
			for(j=0;j<2;j++)
			{
				Statu=FLASH_ProgramHalfWord(Address_Corner_Course+i*4+j*2,Dot_Course_Angle[i][j]);
			}
		}
	
		for(i=0;i<64;i++)
		{
			for(j=0;j<2;j++)
			{
				Statu=FLASH_ProgramHalfWord(Address_Stand_Course+i*4+j*2,Stand_Course_Angle[i][j]);
			}
		}
	
		FLASH_ErasePage(0x0800EC00); //擦除页面	 弯道坐标修改
	//	FLASH_ErasePage(0x0800F000); //擦除页面	 弯道坐标修改
		for(i=0;i<64;i++)
		{
		  for(j=0;j<4;j++)
		  {
		
			Statu=FLASH_ProgramWord(Address_Corner+i*16+j*4,dot[i][j]); //写入一个坐标点数据
		  }
		}
	
		FLASH_ErasePage(0x0800F400); //擦除页面	 站点坐标修改
	//	FLASH_ErasePage(0x0800F800); //擦除页面	 站点坐标修改
	//	FLASH_ErasePage(0x0800FC00); //擦除页面	 站点坐标修改
		for(i=0;i<64;i++)
		{
		  for(j=0;j<4;j++)
		  {	
			Statu=FLASH_ProgramWord(Address_Stand+i*16+j*4,Stand[i][j]); //写入一个坐标点数据
		  }
		}
		FLASH_Lock();
	}

	if(Statu != FLASH_TIMEOUT)
    {
		;
	}

}
/************************************
函数功能：初始化弯道、站点、ID号、IP端口号和超速值
函数入口：无
函数出口：无
函数说明：		 
***********************************/
void Flash_Init_Read(void)
{

	u32 *P_Corner=(uint32_t*)0x0800EC00;   //定义一个FLASH地址指针，第59页	弯道坐标起始地址
	u32 *P_Stand=(uint32_t*)0x0800F400;   //定义一个FLASH地址指针，第61页	站点坐标起始地址
	
	u32 *P_Speed=(uint32_t*)0x0800DC00;   //定义一个FLASH地址指针，第55页 超速值
	u32 *P_ID=(uint32_t*)0x0800E000;   //定义一个FLASH地址指针，第56页 超速值、ID号、IP和端口号起始地址
	u32 *P_Corner_Course=(uint32_t*)0x0800E400;   //定义一个FLASH地址指针，第57页  弯道航向角坐标起始地址
	u32 *P_Stand_Course=(uint32_t*)0x0800E800;   //定义一个FLASH地址指针，第58页	站点航向角坐标起始地址


	u8 i,j;
	u32  temp;
	FLASH_Unlock( ); 
	temp=*P_Speed;
	shili_to_shuirao=temp&0x0000ffff;	   //读取直道山上超速值
	temp=temp>>16;
	laomo_to_huangshi=temp&0x0000ffff;	   //读取直道山下超速值

	P_Speed++;
	temp=*P_Speed;
	sancha_to_tongqiang=temp&0x0000ffff;		   //读取弯道超速值
	temp=temp>>16;
	Other_Speeding_Value=temp&0x0000ffff;	   //读取直道山下超速值

	P_Speed++;
	temp=*P_Speed;
	Corner_Speeding_Value=temp&0x0000ffff;		   //读取弯道超速值
	temp=temp>>16;
	Update_Rate=temp&0x0000ffff;	   //读取回传时间间隔

	for(i=0;i<2;i++)
	{
		
		temp=*P_ID;
		for(j=0;j<4;j++)
		{
			IP_Buffer[i*4+j]=temp&0x000000ff;			//读取IP地址
			temp=temp>>8;
		}
		P_ID++;
	}	
	temp=*P_ID;
	for(j=0;j<4;j++)
	{
		PORT_Buffer[j]=temp&0x000000ff;		 //读取端口号
		temp=temp>>8;
	}
	IP_Conversion(IP_Buffer,PORT_Buffer);


	P_ID++;
	temp=*P_ID;
	for(j=0;j<4;j++)
	{
		id[j]=temp&0x000000ff;
		temp=temp>>8;
	}

	for(i=0;i<64;i++)				   //读取弯道航向角数据
	{
	  
	  	temp=*P_Corner_Course;
		Dot_Course_Angle[i][0]=temp&0x0000ffff;
		temp=temp>>16;
		Dot_Course_Angle[i][1]=temp&0x0000ffff;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
		P_Corner_Course++;
	  
	}

	for(i=0;i<64;i++)				  //读取站点航向角数据
	{
		
	  	temp=*P_Stand_Course;
		Stand_Course_Angle[i][0]=temp&0x0000ffff;
		temp=temp>>16;
		Stand_Course_Angle[i][1]=temp&0x0000ffff;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
		P_Stand_Course++;
	 
	}

	for(i=0;i<64;i++)			//读取弯道经纬度数据
	{
	  for(j=0;j<4;j++)
	  {
		dot[i][j]=*P_Corner;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
		P_Corner++;
	  }
	}

	for(i=0;i<64;i++)			   //读取站点经纬度数据
	{
	  for(j=0;j<4;j++)
	  {
		Stand[i][j]=*P_Stand;
		P_Stand++;
	  }
	}
	FLASH_Lock();

}

void IP_Conversion(u8 IP_Buf[8],u8 PORT_Buf[4])
{
	u8 Wang=0,Qian=0,Bai=0,Shi=0,Ge=0;
	u8 WD=0;
	u8 i=0,j=0;
	u16 tmp=0;
	   
	for(j=0;j<4;j++)
	{
	  tmp=tmp*16+PORT_Buf[j];
	}
	Wang=tmp/10000;
	Qian=tmp%10000/1000;
	Bai=tmp%1000/100;
	Shi=tmp%100/10;
	Ge=tmp%10;

	if(Wang==0x00)
	{
		if(Qian==0x00)
		{
			if(Bai==0x00)
			{
				if(Shi==0x00)
				{
					PORT[i++]=Ge+0x30;
				}
				else
				{
					PORT[i++]=Shi+0x30;
					PORT[i++]=Ge+0x30;
				}

			}
			else
			{
				PORT[i++]=Bai+0x30;
				PORT[i++]=Shi+0x30;
				PORT[i++]=Ge+0x30;
			}
		}
		else
		{
			PORT[i++]=Qian+0x30;
			PORT[i++]=Bai+0x30;
			PORT[i++]=Shi+0x30;
			PORT[i++]=Ge+0x30;
		}
	}
	else
	{
		PORT[i++]=Wang+0x30;
		PORT[i++]=Qian+0x30;
		PORT[i++]=Bai+0x30;
		PORT[i++]=Shi+0x30;
		PORT[i++]=Ge+0x30;			
	}
	PORT[i++]='\0';

	for(j=0,i=0;j<4;j++)
	{
		WD=IP_Buf[2*j]*16+IP_Buf[2*j+1];
		Bai=WD/100;
		Shi=WD%100/10;
		Ge=WD%10;
		if(Bai==0x00)
		{
			if(Shi==0x00)
			{
				IP[i++]=Ge+0x30;
			}
			else
			{
				IP[i++]=Shi+0x30;
				IP[i++]=Ge+0x30;
			}
		}
		else
		{
			IP[i++]=Bai+0x30;
			IP[i++]=Shi+0x30;
			IP[i++]=Ge+0x30;
		}

		if(j<3)
		{
		  IP[i++]=0x2e;
		}
		else
		{
		  IP[i++]='\0';
		}
	}


}

/************************************
函数功能：弯道坐标数据修改
函数入口：num为弯道号，direction=0表示进弯点
		  direction=1表示出弯点
函数出口：无
函数说明：		 
***********************************/
void Corner_Modify(u8 Rev_data[])
{
	FLASH_Status Statu;
	u8 i,j;
	u8 direction=0;
	u32 num=0;;
	

	Modify_Weidu_In=0;
	Modify_Jingdu_In=0;
	Modify_Course_In=0;
	Modify_Weidu_Out=0;
	Modify_Jingdu_Out=0;
	Modify_Course_Out=0;
	
	for(i=0;i<5;i++)
	{
		num=num*10+(Rev_data[9+i]-0x30);
	}

	direction=Rev_data[14]-0x30;

	for(i=0;i<8;i++)
	{
	 Modify_Weidu_In=Modify_Weidu_In*10+(Rev_data[i+15]-0x30);
	 Modify_Weidu_Out=Modify_Weidu_Out*10+(Rev_data[i+36]-0x30);
	}
	for(i=0;i<9;i++)
	{
	 Modify_Jingdu_In=Modify_Jingdu_In*10+(Rev_data[i+23]-0x30);
	 Modify_Jingdu_Out=Modify_Jingdu_Out*10+(Rev_data[i+44]-0x30);
	}
	for(i=0;i<3;i++)
	{
	 Modify_Course_In=Modify_Course_In*10+(Rev_data[i+32]-0x30);
	 Modify_Course_Out=Modify_Course_Out*10+(Rev_data[i+53]-0x30);
	}

	if(!direction)
	{
	 dot[num][0]=Modify_Weidu_In;
	 dot[num][1]=Modify_Jingdu_In;
	 Dot_Course_Angle[num][0]=Modify_Course_In;

	 dot[num][2]=Modify_Weidu_Out;
	 dot[num][3]=Modify_Jingdu_Out;
	 Dot_Course_Angle[num][1]=Modify_Course_Out;
	}
	else
	{
	 dot[num][0]=Modify_Weidu_Out;
	 dot[num][1]=Modify_Jingdu_Out;
	 Dot_Course_Angle[num][0]=Modify_Course_Out;

	 dot[num][2]=Modify_Weidu_In;
	 dot[num][3]=Modify_Jingdu_In;
	 Dot_Course_Angle[num][1]=Modify_Course_In;
	}

	FLASH_Unlock(); 
	Error=0;
	FLASH_ErasePage(0x0800EC00); //擦除页面	 弯道坐标修改
	
	for(i=0;i<64;i++)
	{
	  for(j=0;j<4;j++)
	  {
	
		Statu=FLASH_ProgramWord(Address_Corner+i*16+j*4,dot[i][j]); //写入一个坐标点数据
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	
	  }
	}
			
	FLASH_ErasePage(0x0800E400); //擦除页面	 弯道航向角修改
	
	for(i=0;i<64;i++)
	{
		for(j=0;j<2;j++)
		{
			Statu=FLASH_ProgramHalfWord(Address_Corner_Course+i*4+j*2,Dot_Course_Angle[i][j]);		
		}
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	} 
	FLASH_Lock();  
	
	if(!Error)
	{
	   PC_Command=1;
	   UART3_SendString("*Success#");
	   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	   Delay_1ms(500);	  
	   GPIO_SetBits(GPIOB,GPIO_Pin_9);	
	}
	else
	{	  
	   UART3_SendString("*Fail#");
	}

}
/************************************
函数功能：站点坐标数据修改
函数入口：num为站点号，direction=0表示进站点
		  direction=1表示出站点
函数出口：无
函数说明：		 
***********************************/
void Stand_Modify(u8 Rev_data[])
{

   FLASH_Status Statu;
	u8 i,j;
	u8 direction=0;
	u32 num=0;;
	

	Modify_Weidu_In=0;
	Modify_Jingdu_In=0;
	Modify_Course_In=0;
	Modify_Weidu_Out=0;
	Modify_Jingdu_Out=0;
	Modify_Course_Out=0;
	
	for(i=0;i<5;i++)
	{
		num=num*10+(Rev_data[9+i]-0x30);
	}

	direction=Rev_data[14]-0x30;

	for(i=0;i<8;i++)
	{
	 Modify_Weidu_In=Modify_Weidu_In*10+(Rev_data[i+15]-0x30);
	 Modify_Weidu_Out=Modify_Weidu_Out*10+(Rev_data[i+36]-0x30);
	}
	for(i=0;i<9;i++)
	{
	 Modify_Jingdu_In=Modify_Jingdu_In*10+(Rev_data[i+23]-0x30);
	 Modify_Jingdu_Out=Modify_Jingdu_Out*10+(Rev_data[i+44]-0x30);
	}
	for(i=0;i<3;i++)
	{
	 Modify_Course_In=Modify_Course_In*10+(Rev_data[i+32]-0x30);
	 Modify_Course_Out=Modify_Course_Out*10+(Rev_data[i+53]-0x30);
	}

	if(!direction)
	{
	 Stand[num][0]=Modify_Weidu_In;
	 Stand[num][1]=Modify_Jingdu_In;
	 Stand_Course_Angle[num][0]=Modify_Course_In;

	 Stand[num][2]=Modify_Weidu_Out;
	 Stand[num][3]=Modify_Jingdu_Out;
	 Stand_Course_Angle[num][1]=Modify_Course_Out;
	}
	else
	{
	 Stand[num][0]=Modify_Weidu_Out;
	 Stand[num][1]=Modify_Jingdu_Out;
	 Stand_Course_Angle[num][0]=Modify_Course_Out;

	 Stand[num][2]=Modify_Weidu_In;
	 Stand[num][3]=Modify_Jingdu_In;
	 Stand_Course_Angle[num][1]=Modify_Course_In;
	}

	FLASH_Unlock(); 
	Error=0;

	FLASH_ErasePage(0x0800F400); //擦除页面	 弯道坐标修改
	
	for(i=0;i<64;i++)
	{
	  for(j=0;j<4;j++)
	  {
	
		Statu=FLASH_ProgramWord(Address_Stand+i*16+j*4,Stand[i][j]); //写入一个坐标点数据
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	  }
	}
			
	FLASH_ErasePage(0x0800E800); //擦除页面	 弯道航向角修改
	
	for(i=0;i<64;i++)
	{
		for(j=0;j<2;j++)
		{
			Statu=FLASH_ProgramHalfWord(Address_Stand_Course+i*4+j*2,Stand_Course_Angle[i][j]);		
			if(Statu!=FLASH_COMPLETE)
			{
				Error=1;
			}
		}
	} 
	FLASH_Lock();  

	if(!Error)
	{
	   PC_Command=1;
	   UART3_SendString("*Success#");
	   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	    Delay_1ms(500);	 	  
	   GPIO_SetBits(GPIOB,GPIO_Pin_9);	
	}
	else
	{	  
	   UART3_SendString("*Fail#");
	}
}
/************************************
函数功能：超速值、ID号、IP和端口号数据修改
函数入口：无
函数出口：无
函数说明：		 
***********************************/
void Other_Modify(void)
{
	
	u8 i;
	uint16_t temp;
	FLASH_Status Statu;

	FLASH_Unlock(); 
	Error=0;
	FLASH_ErasePage(0x0800E000); //擦除页面	 超速值、ID号、IP和端口号修改
	

	for(i=0;i<4;i++)
	{
		temp=IP_Buffer[2*i+1];
		temp=temp<<8;
		temp=temp+IP_Buffer[2*i];
		Statu=FLASH_ProgramHalfWord(Address_ID+i*2,temp);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	}
	for(i=0;i<2;i++)
	{
		temp=PORT_Buffer[2*i+1];
		temp=temp<<8;
		temp=temp+PORT_Buffer[2*i];
		Statu=FLASH_ProgramHalfWord(Address_ID+8+i*2,temp);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	}
	for(i=0;i<2;i++)
	{
		temp=id[2*i+1];
		temp=temp<<8;
		temp=temp+id[2*i];
		Statu=FLASH_ProgramHalfWord(Address_ID+12+i*2,temp);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	}
	FLASH_Lock(); 

	if(!Error)
	{
	   PC_Command=1;
	  // Modify_Response(Function_Word);
	   UART3_SendString("*Success#");
	   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	    Delay_1ms(500);	 	  
	   GPIO_SetBits(GPIOB,GPIO_Pin_9);	
	}
	else
	{	   
	   UART3_SendString("*Fail#");
	}	
}


void Modify_Speed(u8 Rev_Data[])
{
	 u8 Temp;
	 uint16_t speed;
	 FLASH_Status Statu;

	 Temp=Rev_Data[10];
	 speed=(Rev_Data[11]-0x30)*10+Rev_Data[12]-0x30;
	 switch(Temp)
	 {
		 case 0x30:Corner_Speeding_Value=speed;break;
		 case 0x31:Other_Speeding_Value=speed;break;
		 case 0x32:shili_to_shuirao=speed;break;
		 case 0x33:laomo_to_huangshi=speed;break;
		 case 0x34:sancha_to_tongqiang=speed;break;
		 default: break;
	 }
	 
	FLASH_Unlock(); 
	Error=0;
	FLASH_ErasePage(0x0800DC00); //擦除页面	 超速值修改
	
	Statu=FLASH_ProgramHalfWord(Address_Speed,shili_to_shuirao);
	if(Statu!=FLASH_COMPLETE)
	{
		Error=1;
	}

	Statu=FLASH_ProgramHalfWord(Address_Speed+2,laomo_to_huangshi);
	if(Statu!=FLASH_COMPLETE)
	{
		Error=1;
	}

	Statu=FLASH_ProgramHalfWord(Address_Speed+4,sancha_to_tongqiang);
	if(Statu!=FLASH_COMPLETE)
	{
		Error=1;
	}

	Statu=FLASH_ProgramHalfWord(Address_Speed+6,Other_Speeding_Value);
	if(Statu!=FLASH_COMPLETE)
	{
		Error=1;
	}

	Statu=FLASH_ProgramHalfWord(Address_Speed+8,Corner_Speeding_Value);
	if(Statu!=FLASH_COMPLETE)
	{
		Error=1;
	}

	Statu=FLASH_ProgramHalfWord(Address_Speed+10,Update_Rate);
	if(Statu!=FLASH_COMPLETE)
	{
		Error=1;
	}
	FLASH_Lock();

	if(!Error)
	{
	   PC_Command=1;
	   UART3_SendString("*Success#");
	  // Modify_Response(Function_Word);
	   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	    Delay_1ms(500);	 	  
	   GPIO_SetBits(GPIOB,GPIO_Pin_9);	
	}
	else
	{
	  
	   UART3_SendString("*Fail#");
	}
}

void Modify_Id(u8 Rev_Data[])
{
	u8 i;
	u8 Temp;
	Temp=Rev_Data[8];
	if(Temp=='M')
	{
	//	j=(Rev_Data[9]-0x30)*10+Rev_Data[10]-0x30;
		for(i=0;i<4;i++)
		{
		   id[i]=Rev_Data[11+i];
		}
		Other_Modify();
	}
}

void Modify_Update_Rate(u8 Rev_Data[])
{
	FLASH_Status Statu;
	u8 i;
	u8 Temp;
	Temp=Rev_Data[8];
	if(Temp=='I')
	{		
		Update_Rate=0;
		for(i=0;i<4;i++)
		{
		   if(Rev_Data[9+i]>0x40)
		   {
			 Rev_Data[9+i]=Rev_Data[9+i]-0x07;
		   }
		   Update_Rate=Update_Rate*16+Rev_Data[9+i]-0x30;
		}
		Update_Rate=Update_Rate*4;
		FLASH_Unlock(); 
		Error=0;
		FLASH_ErasePage(0x0800DC00); //擦除页面	 超速值修改
		
		Statu=FLASH_ProgramHalfWord(Address_Speed,shili_to_shuirao);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	
		Statu=FLASH_ProgramHalfWord(Address_Speed+2,laomo_to_huangshi);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	
		Statu=FLASH_ProgramHalfWord(Address_Speed+4,sancha_to_tongqiang);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	
		Statu=FLASH_ProgramHalfWord(Address_Speed+6,Other_Speeding_Value);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	
		Statu=FLASH_ProgramHalfWord(Address_Speed+8,Corner_Speeding_Value);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
	
		Statu=FLASH_ProgramHalfWord(Address_Speed+10,Update_Rate);
		if(Statu!=FLASH_COMPLETE)
		{
			Error=1;
		}
		FLASH_Lock();
	
		if(!Error)
		{
		   PC_Command=1;
		   UART3_SendString("*Success#");
		 //  Modify_Response(Function_Word);
		   GPIO_ResetBits(GPIOB,GPIO_Pin_9);
		    Delay_1ms(500);	 	  
		   GPIO_SetBits(GPIOB,GPIO_Pin_9);	
		}
		else
		{		   
		   UART3_SendString("*Fail#");
		}
	}
}

void Modify_IP(u8 Rev_Data[])
{
	u8 i;
	u8 Temp;
	Temp=Rev_Data[8];
	if(Temp=='A')
	{		
		for(i=0;i<8;i++)
		{
		   if(Rev_Data[9+i]<0x40)
		   {
		   	 IP_Buffer[i]=Rev_Data[9+i]-0x30;
		   }
		   else
		   {
			 IP_Buffer[i]=Rev_Data[9+i]-0x37;
		   }
		}
		for(i=0;i<4;i++)
		{
		   if(Rev_Data[21+i]<0x40)
		   {
		   	  PORT_Buffer[i]=Rev_Data[21+i]-0x30;
		   }
		   else
		   {
		   	 PORT_Buffer[i]=Rev_Data[21+i]-0x37;
		   }
		}
		IP_Conversion(IP_Buffer,PORT_Buffer);
		Other_Modify();
		AT_Command(0x03);
		OSTimeDlyHMSM(0,0,2,0);
	}
}
